1 Zbiór danych diabetycy

W pierwszej kolejności postanowiliśmy porównać działanie naszej implementacji na zbiorze danych przedstawionych w pierwszej publikacji na temat modelu LARS. Dane te dotyczą 442 pacjentów chorych na cukrzycę. Zostali oni opisani za pomocą dziesięciu zmiennych, takich jak wiek, czy ciśnienie krwi. Zadaniem modelu regresyjnego jest dopasowanie się do zmiennej objaśniajacej, odpowiadającej pewnej ilościowej reprezentacji rozwoju choroby po upływie jednego roku.

1.1 LARS

Na początku sprawdźmy jakie wyniki otrzymamy korzystając z gotowej implementacji alogorytmu LARS w R, oraz naszej implementacji w Pythonie.

Rysunek 1: Zmiana parametrów $\beta$ w zależności od iteracji. Po lewej wyniki uzyskane z implementacji w języku Python, po prawej w R

Rysunek 1: Zmiana parametrów \(\beta\) w zależności od iteracji. Po lewej wyniki uzyskane z implementacji w języku Python, po prawej w R

Rysunek 1 przedstawia jak zmieniały się parametry obu modeli w kolejnych iteracjach. Możemy zauważyć, że dla tych danych wykresy są identyczne, a każdy z modeli wykonał 10 iteracji. Dokładne zmiany wartości współczynników \(\beta\), w obu implementacjach możemy obserwować w Tabeli 1 oraz 2.

Tabela 1: Wartości współczynników beta, dla kolejnych iteracji (R)
age sex bmi map tc ldl hdl tch ltg glu
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 60.12 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 361.89 0.00 0.00 0.00 0.00 0.00 301.78 0.00
0.00 0.00 434.76 79.24 0.00 0.00 0.00 0.00 374.92 0.00
0.00 0.00 505.66 191.27 0.00 0.00 -114.10 0.00 439.66 0.00
0.00 -74.92 511.35 234.15 0.00 0.00 -169.71 0.00 450.67 0.00
0.00 -111.98 512.04 252.53 0.00 0.00 -196.05 0.00 452.39 12.08
0.00 -197.76 522.26 297.16 -103.95 0.00 -223.93 0.00 514.75 54.77
0.00 -226.13 526.89 314.39 -195.11 0.00 -152.48 106.34 529.92 64.49
0.00 -227.18 526.39 314.95 -237.34 33.63 -134.60 111.38 545.48 64.61
-10.01 -239.82 519.84 324.39 -792.18 476.75 101.04 177.06 751.28 67.63
Tabela 2: Wartości współczynników beta, dla kolejnych iteracji (Python)
age sex bmi map tc ldl hdl tch ltg glu
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 60.12 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 361.89 0.00 0.00 0.00 0.00 0.00 301.78 0.00
0.00 0.00 434.76 79.24 0.00 0.00 0.00 0.00 374.92 0.00
0.00 0.00 505.66 191.27 0.00 0.00 -114.10 0.00 439.66 0.00
0.00 -74.92 511.35 234.15 0.00 0.00 -169.71 0.00 450.67 0.00
0.00 -111.98 512.04 252.53 0.00 0.00 -196.05 0.00 452.39 12.08
0.00 -197.76 522.26 297.16 -103.95 0.00 -223.93 0.00 514.75 54.77
0.00 -226.13 526.89 314.39 -195.11 0.00 -152.48 106.34 529.92 64.49
0.00 -227.18 526.39 314.95 -237.34 33.63 -134.60 111.38 545.48 64.61
-10.01 -239.82 519.84 324.39 -792.18 476.75 101.04 177.06 751.28 67.63

Powyższe tabele jednoznacznie upewniają nas, że otrzymane wynik są zgodne z tym co uzyskujemy, korzystając z gotowych rozwiązań.

Tak jak zostało wspomniane wcześniej, algorytmy przeprowadziły 10 iteracji. Wynika to z faktu użycia warunku zatrzymującego jego działanie, którym w tym przypadku jest zawarcie wszystkich możliwych zmiennych w zbiorze aktywnym.

Porównanie czasu wykonania

Jeśli chodzi o czas wykonania, to nasz algorytm wypada gorzej niż ten zaimplementowany w języku R. Wynika to z faktu, że gotowa funkcja w R zawiera wiele modyfikacji usprawniających obliczenia, które nie były zawarte w oryginalnej pracy przedstawionej przez Efron et al.

Tabela 3: Porównanie czasów wykonania dla 100 wywołań podane w sekundach
Min. 1st Qu. Median Mean 3rd Qu. Max. Impl.
0.0022899 0.0023338 0.0026269 0.0023716 0.0029030 0.0048195 R
0.0152900 0.0155840 0.0158833 0.0160697 0.0164042 0.0186268 Python

1.2 LASSO

Na tych samych danych ponownie dopasujemy model regresyjny, tym razem wprowadzając modyfikację LASSO.

Zbadamy zmianę współczynników \(\beta\). Wyniki analizy przedstawione są na Rysunku 2. Jak pokazują poniższe wykresy, w tym przypadku wykonanych zostało 12 iteracji. Wiąże się to z faktem, iż jedna ze zmiennych kolejno w iteracji 10 oraz 11 przyjmuje wartość zero (tym samym jest usuwana ze zbioru aktywnego). Mimo to, w ostatniej dwunastej iteracji, zmienna ta ponownie włączana jest do zbioru aktywnego. Algorytm zostaje przerwany w następnym powtórzeniu pętli ze względu na wzrost wartości błędu średniokwadratowego.

Rysunek 2: Zmiana parametrów $\beta$ w zależności od iteracji w modelu LASSO. Po lewej wyniki uzyskane z implementacji w języku Python, po prawej w R

Rysunek 2: Zmiana parametrów \(\beta\) w zależności od iteracji w modelu LASSO. Po lewej wyniki uzyskane z implementacji w języku Python, po prawej w R

Jak wynika z Tabeli 4, w której możemy obserwować dokładne wartości parametrów modelu, zmienną, która została wyrzucona ze zbioru aktywnego, jest HDL, odpowiadająca za poziom cholesterolu u pacjenta.

Tabela 4: Wartości współczynników beta, dla kolejnych iteracji
age sex bmi map tc ldl hdl tch ltg glu
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 60.12 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 361.89 0.00 0.00 0.00 0.00 0.00 301.78 0.00
0.00 0.00 434.76 79.24 0.00 0.00 0.00 0.00 374.92 0.00
0.00 0.00 505.66 191.27 0.00 0.00 -114.10 0.00 439.66 0.00
0.00 -74.92 511.35 234.15 0.00 0.00 -169.71 0.00 450.67 0.00
0.00 -111.98 512.04 252.53 0.00 0.00 -196.05 0.00 452.39 12.08
0.00 -197.76 522.26 297.16 -103.95 0.00 -223.93 0.00 514.75 54.77
0.00 -226.13 526.89 314.39 -195.11 0.00 -152.48 106.34 529.92 64.49
0.00 -227.18 526.39 314.95 -237.34 33.63 -134.60 111.38 545.48 64.61
-5.72 -234.40 522.65 320.34 -554.27 286.74 0.00 148.90 663.03 66.33
-7.01 -237.10 521.08 321.55 -580.44 313.86 0.00 139.86 674.94 67.18
-10.01 -239.82 519.84 324.39 -792.18 476.75 101.04 177.06 751.28 67.63

Porównanie czasu wykonania

Tabela 5 przedstawia średni czas wykonania obliczeń. W obu przypadkach czas ten wzrósł, co oczywiście wynika z konieczności przeprowadzenia dodatkowych dwóch iteracji, jednak ich stosunek długości działania nadal pozostaje podobny.

Tabela 5: Porównanie czasów wykonania dla 100 wywołań podane w sekundach
Min. 1st Qu. Median Mean 3rd Qu. Max. Impl.
0.0027053 0.0027482 0.0033333 0.0027814 0.0029669 0.0405104 R
0.0173213 0.0177775 0.0181322 0.0183315 0.0187123 0.0212936 Python

2 Zbiór danych Superconductivity

Kolejnym zestawem danych, który postanowiliśmy sprawdzić jest zbiór dotyczący właściwości chemicznych materiałów przewodzących 1. Składa się on z 21263 nadprzewodników opisanych za pomocą ilościowej reprezentacji ich właściwości chemicznych, jak masa atomowa, czy gęstość. Na pełen opis składa się 81 atrybutów. Zadaniem jest, na podstawie podanych własności, określić jaka jest temperatura krytyczna danego nadprzewodnika. Dane, ze względu na bardzo duże różnice między wariancjami kolejnych komuln, zostały unormowane.

2.1 LARS

Ze względu na mnogość zmiennych objaśniających, wykres przedstawiający zachowanie parametrów modelu może okazać się mało czytelny, jednak w łatwy sposób pozwala nam to określić, że rozwiązania uzyskane w wyniki dwóch implementacji są takie same.

Rysunek 3: Zmiana parametrów $\beta$ w zależności od iteracji w modelu LARS. Po lewej wyniki uzyskane z implementacji w języku Python, po prawej w R

Rysunek 3: Zmiana parametrów \(\beta\) w zależności od iteracji w modelu LARS. Po lewej wyniki uzyskane z implementacji w języku Python, po prawej w R

Poniższy rysunek ponownie pokazuje, że sprawdzane implementacje zwracają takie same wyniki dla dużych zbiorów.

Rysunek 4: Wartości parametrów otrzymanego modelu regresji

Rysunek 4: Wartości parametrów otrzymanego modelu regresji

Porównanie czasu wykonania

Dla modelu, który zbudowany jest z dużej ilości zmiennych, różnice w czasie zmieniają się znacząco, przez co z początkowego niemal 6 krótszego czasu wykonania dla implementacji w języku R, dla tego zbioru otrzymujemy wyniki, w których implementacja w języku Python jest wydajniejsza, co przekłada się na niemal 0,4 sekundy różnicy w średnim czas wykonania.

Tabela 6: Porównanie czasów wykonania dla 100 wywołań podane w sekundach
Min. 1st Qu. Median Mean 3rd Qu. Max. Impl.
1.356156 1.363126 1.382907 1.378156 1.399457 1.424141 R
1.009961 1.011283 1.020360 1.020700 1.027303 1.035413 Python

2.2 LASSO

Wywołanie algorytmów z uwzględnieniem kroku LASSO skutkuje otrzymaniem 135 iteracji

Ze względu na ilość zmiennych objaśniających, wykres przedstawiający zachowanie parametrów modelu może okazać się mało czytelny, jednak w łatwy sposób pozwala nam to określić, że rozwiązania uzyskane oboma implementacjami dają takie same rezultaty.

Rysunek 5: Zmiana parametrów $\beta$ w zależności od iteracji w modelu LASSO. Po lewej wyniki uzyskane z implementacji w języku Python, po prawej w R

Rysunek 5: Zmiana parametrów \(\beta\) w zależności od iteracji w modelu LASSO. Po lewej wyniki uzyskane z implementacji w języku Python, po prawej w R

Porównanie parametrów obu modeli stworzonych przy pomocy alorytmu LARS i jego modyfikacji LASSO, przedstawione jest na Rysunku 6., gdzie widzimy, iż mimo że rozwiązanie z krokiem LASSO potrzebowało niemal 50 iteracji więcej, końcowe parametry modelu są identyczne.

Rysunek 6: Wartości parametrów otrzymanego modelu regresji

Rysunek 6: Wartości parametrów otrzymanego modelu regresji

Ciekawym zatem wydaje się porównanie jak zmieniał się błąd średniokwadratowy w czasie iteracji tymi dwoma metodami.

Jak pokazuje Rysunek 7. w pierszwych iteracjach zachowują się tak samo, co oznacza, że wtedy nie nastąpiło wyrzucenie zmiennych ze zbioru aktywnego. Obie metody zmierzają do wartości, ok. 1493 (zaznaczonej przerywaną linią), jednak w przypadku modelu LARS, zbieżność jest szybsza.

Rysunek 7: Wartości błędu średniokwadratowego w kolejnych iteracjach dla kroków LARS i LASSO

Rysunek 7: Wartości błędu średniokwadratowego w kolejnych iteracjach dla kroków LARS i LASSO

Porównanie czasu wykonania

W tym przypadku ponownie możemy wysnuć wniosek, że nasza implementacja zapewnia krótszy czas działania o ok. 0,4 sekundy w porównaniu do funkcji w języku R.

Tabela 7: Porównanie czasów wykonania dla 100 wywołań podane w sekundach
Min. 1st Qu. Median Mean 3rd Qu. Max. Impl.
2.120216 2.157352 2.177288 2.180801 2.199809 2.220159 R
1.864195 1.874865 1.876294 1.877839 1.881009 1.897124 Python

3 Music Data Set

Ostatnim przez nas analizowany zbiorem jest “Geographical Original of Music Data Set”. Został zbudowany z 1059 utworów, pochodzących z 33 krajów. Każdy z rekordów zawiera informacje dotyczące utworu, opisanych za pomocą 116 zmiennych objaśniających, a także dwie, będące wartością szerokości i długości geograficznej. Celem modelu jest wykrycie charakterystycznych cech dla muzyki w danym położeniu geograficznym. Zestaw posiada 1059 obserwacji, co daje niewielki stosunek ich liczby do atrybutów, przez co może to być wyzwanie dla modelu.

3.1 LARS

Pierwszą bardzo istotną zmianą w kontekście pozostałych modeli jest występowanie zmiennych współliniowych. Oznacza to, że wartość korelacji wyliczana w kolejnych iteracjach dla takich zmiennych będzie bardzo zbliżona. Modyfikacją, którą zaobserwowaliśmy w implementacji R, a nie została opisana w oryginalnej pracy, na której oparta jest nasze rozwiazanie, jest wzięcie wszystkich zmiennych, których korelacja z aktualnymi residuami znajduje się w odległości nie większej niż ustalona wartość \(\epsilon\). W naszym przypadku wartość ta wynosi \(10^{-6}\). Wszystkie zmienne z tego przedziału, zostają trwale usunięte ze zbioru nieaktywnego, oprócz jednej, która następnie trafia do zbioru aktywnego. Tym sposobem w kolejnych iteracjach, odrzucane są następujące zmienne:

  • [48, 49, \(\ldots\), 58]

  • [77, 78, \(\ldots\), 87]

  • [19, 20, \(\ldots\), 29]

Rysunek 8: Zmiana parametrów $\beta$ w zależności od iteracji w modelu LARS. Po lewej wyniki uzyskane z implementacji w języku Python, po prawej w R

Rysunek 8: Zmiana parametrów \(\beta\) w zależności od iteracji w modelu LARS. Po lewej wyniki uzyskane z implementacji w języku Python, po prawej w R

W przeciwieństwie do pozostałych przypadków, wykres pokazujący zmianę parametórw \(\beta\) jest różny dla dwóch implementacji. Jednak z analizy końcowych wartości parametrów wynika, że modele te nie odbiegają bardzo od siebie.

Rysunek 9: Wartości parametrów otrzymanego modelu regresji

Rysunek 9: Wartości parametrów otrzymanego modelu regresji

Rysunek 10: Wartości błędu średniokwadratowego w kolejnych iteracjach dla implementacji w R i Python

Rysunek 10: Wartości błędu średniokwadratowego w kolejnych iteracjach dla implementacji w R i Python

Analiza wykresu zmiany błędu średniokwadratowego dla kolejnych iteracji pokazuje, że poczatkowo dopasowywanie modelu przebiegało podobnie, następnie około 30 iteracji, występuje rozbieżność. Wartym uwagi jest fakty, że dla naszego modelu w Pythonie końcowa wartość MSE jest niemal identyczna jak ta uzyskana funkcją w R, jednak nasz model zawiera 10 zmiennych mniej, co jest bardzo ważne z punktu widzenia generalizacji rozwiązania.

Porównanie czasu wykonania

Ponownie mamy do czynienia z sytuacją, w której liczba obserwacji nie jest duża. Skutkuje to, zgodnie z naszymi wcześniejszymi obserwacjami tym, że czas wykonywania obliczeń jest krótszy dla R. Taki zbiór danych pozwolił na uzyskanie tylko 3-krotnej różnicy w czasie wykonania, co w porównaniu do zbioru diabetyków, jest zmniejszeniem dwukrotnym stosunku czasów wykonania.

Tabela 8: Porównanie czasów wykonania dla 100 wywołań podane w sekundach
Min. 1st Qu. Median Mean 3rd Qu. Max. Impl.
0.0644092 0.0694815 0.0723890 0.0731185 0.0742834 0.0821699 R
0.2818258 0.2885426 0.2945225 0.2969561 0.3011110 0.3703771 Python

3.2 LASSO

Również w przypadku wersji LASSO tej implementacji obserwujemy podobne zachowanie algorytmu, gdzie trwale usuwane są niektóre ze zmiennych.

Rysunek 11: Zmiana parametrów $\beta$ w zależności od iteracji w modelu LASSO. Po lewej wyniki uzyskane z implementacji w języku Python, po prawej w R

Rysunek 11: Zmiana parametrów \(\beta\) w zależności od iteracji w modelu LASSO. Po lewej wyniki uzyskane z implementacji w języku Python, po prawej w R

Tym razem końcowym rezultatem w obu przypadkach jest model, zawierający te same zmienne, jednak wartości parametrów różnią się (co możemy obserwować na wykresie poniżej).

Rysunek 12: Wartości parametrów otrzymanego modelu regresji

Rysunek 12: Wartości parametrów otrzymanego modelu regresji

Różnice także widoczne są w czasie procesu dopasowania modelu, gdzie między 9 a 43 iteracją występowały rozbieżności co do wartości błędu średniokwadratowego. Mimo to, w ostatniej iteracji obu algorytmów, wartości te są bardzo zbliżone.

Rysunek 13: Wartości błędu średniokwadratowego w kolejnych iteracjach dla implementacji w R i Pythonie

Rysunek 13: Wartości błędu średniokwadratowego w kolejnych iteracjach dla implementacji w R i Pythonie

Porównanie czasu wykonania

Tabela 9: Porównanie czasów wykonania dla 100 wywołań podane w sekundach
Min. 1st Qu. Median Mean 3rd Qu. Max. Impl.
0.0790536 0.0813563 0.0847367 0.0841160 0.0854550 0.1295152 R
0.3390416 0.3473168 0.3515349 0.3561239 0.3577516 0.4587825 Python

4 Podsumowanie

Przeprowadziliśmy porównanie naszej implementacji w języku Python z implementacją w języku R. Napisany przez nas kod podąża za krokami opisanymi w oryginalnej pracy, jednocześnie dodaliśmy krok polegający na rozwiązaniu problemu współliniowości, który nie został przytoczony w publikacji. Zauważyliśmy rozbieżności dotyczące czasów działania w zależności od analizowanego zbioru.

Wnioski:

Wynika to w naszej opinii z zastosowania pewnych “sztuczek” implementacyjnych, które nie zostały opisane w oryginalnej pracy, a do których też w pełni nie mamy dostępu na skutek niepełnej jawności kodu.

Jest to możliwe z uwagi na wydajne wykonywanie operacji macierzowych (w tym odwracania macierzy).

Trudno jest jednoznacznie zidentyfikować powód takiej sytuacji z uwagi na wcześniej wspomnianą niepełną jawność kodu w R. Mimo to, końcowy wynik jest zbliżony. Co więcej otrzymany przez nas model LARS, w naszej opinii daje lepszy wynik końcowy, ze względu na zawarcie mniejszej liczby zmiennych, jednocześnie otrzymując bardzo zbliżone wartości błędu średniokwadratowego, co ma znaczenie w generalizacji rozwiązania.